package py.tres_mosqueteros.eventos.whatson;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import py.tres_mosqueteros.eventos.entidades.Evento;
import py.tres_mosqueteros.eventos.entidades.Util;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

//import com.control.controlprueba.R;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter;
import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapaActivity extends Fragment {
	MapView mapView;
	GoogleMap map;
	GoogleMap googleMap; // referencia al mapa
	JSONArray ubicaciones;
	String mCurFilter;
	HashMap<Marker, Evento> eventosMap;
	View viewMapaXML;
	ArrayList<Marker> markerArray;
	Boolean banderaSeCreoNuevoEvento;
	Marker nuevoMarkerEventoCreado;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setHasOptionsMenu(true);
	}

	// Funcion que se ejecuta al abrir el fragment, similar al oncreate
	@Override
	public View onCreateView(LayoutInflater inflater,
			final ViewGroup container, Bundle savedInstanceState) {
		View v = inflater.inflate(R.layout.mapa, container, false);
		viewMapaXML = v;
		// Obtiene el MapView desde el XML layout
		mapView = (MapView) v.findViewById(R.id.mapview);
		mapView.onCreate(savedInstanceState);

		// Inicializa el hasmap que contiene la referencia del evento
		// a partir del marker
		eventosMap = new HashMap<Marker, Evento>();

		final LayoutInflater inflador = inflater;
		// Obtiene la referencia al mapa en si
		map = mapView.getMap();
		map.getUiSettings().setMyLocationButtonEnabled(false);
		map.setMyLocationEnabled(true);

		map.getUiSettings().setZoomControlsEnabled(true);

		map.getUiSettings().setCompassEnabled(true);

		map.getUiSettings().setAllGesturesEnabled(true);

		new Ubicaciones().execute();
		// map.addMarker(new MarkerOptions().position(new LatLng(-25.2968332,
		// -57.594002)));
		// inicializar mapa para poder centrar la camara en una ubicacion
		MapsInitializer.initialize(this.getActivity());

		// Centra el mapa en la ubicacion indicada
		// lo ideal centrar en su ubicacion actual
		CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
				new LatLng(-25.2968332, -57.594002), 5);
		map.animateCamera(cameraUpdate);

		markerArray = new ArrayList<Marker>(); // se crea un array de los
												// markers existentes
		banderaSeCreoNuevoEvento = false;

		// Setting a custom info window adapter for the google map
		map.setInfoWindowAdapter(new InfoWindowAdapter() {

			// Use default InfoWindow frame
			@Override
			public View getInfoWindow(Marker arg0) {
				return null;
			}

			// Defines the contents of the InfoWindow
			@Override
			public View getInfoContents(Marker markerParam) {

				// Getting view from the layout file info_window_layout
				View v = inflador.inflate(R.layout.infowindows_layout, null);

				// Obtenemos el evento a partir el marker
				Evento evento = eventosMap.get(markerParam);

				// Obtenemos la referencia al ImageView de la imagen
				ImageView imagen = (ImageView) v
						.findViewById(R.id.imagenPerfilPreview);

				// Obtenemos la referencia al TextView del titulo
				TextView tituloPerfilPreview = (TextView) v
						.findViewById(R.id.tituloPerfilPreview);

				// Obtenemos la referencia al TextView de la descripcion
				TextView descripcionPerfilPreview = (TextView) v
						.findViewById(R.id.descricionPerfilPreview);

				// Obtenemos la referencia al RatingBar
				RatingBar ratingBar = (RatingBar) v
						.findViewById(R.id.ratingBar);

				imagen.setImageDrawable(getResources().getDrawable(
						R.drawable.ic_launcher));
				tituloPerfilPreview.setText(evento.getNombre());
				descripcionPerfilPreview.setText(evento.getNombre());
				ratingBar.setRating(4);
				return v;

			}
		});

		map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
			@Override
			public void onInfoWindowClick(Marker marker) {
				// getActivity().setContentView(R.layout.profile);

				if (banderaSeCreoNuevoEvento == false) { //si se accede a un marker de un evento ya creado
					Intent i = new Intent(getActivity().getBaseContext(),
							PerfilActivity.class);
					String idEvento = eventosMap.get(marker).getId();
					i.putExtra("eventoId", idEvento);
					startActivity(i);
				} else { //si se accede a un marker de un evento nuevo
					Intent i = new Intent(getActivity().getBaseContext(),
							CrearEventoActivity.class);
					i.putExtra("latlong", marker.getPosition());
					startActivity(i);
				}

			}
		});

		// //////////////////////////////////////////////////////////////////////

		ImageButton crearEvento = (ImageButton) viewMapaXML
				.findViewById(R.id.crearEventoButton);
		crearEvento.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// map.clear(); // limpiamos el mapa
				// cambiar color markers markers

				for (Marker m : markerArray) {
					m.setIcon(BitmapDescriptorFactory
							.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
					// m.setVisible(false);
				}
				//
				// seteamos la opcion de marcar

				ImageButton crearEventoButton = (ImageButton) viewMapaXML
						.findViewById(R.id.crearEventoButton);
				crearEventoButton.setVisibility(View.GONE);

				ImageButton buscarButton = (ImageButton) viewMapaXML
						.findViewById(R.id.subirFotoButton);
				buscarButton.setVisibility(View.GONE);

				ImageButton volverButton = (ImageButton) viewMapaXML
						.findViewById(R.id.volverButton);

				volverButton.setVisibility(View.VISIBLE);

				volverButton.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						try {
							for (Marker m : markerArray) {
								m.setIcon(BitmapDescriptorFactory
										.defaultMarker(BitmapDescriptorFactory.HUE_RED));
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
						map.setOnMapClickListener(new OnMapClickListener() {
							@Override
							public void onMapClick(LatLng arg0) {
								// no se hace nada
							}

						});
						// map.clear();
						// new Ubicaciones().execute();
						ImageButton crearEventoButton = (ImageButton) viewMapaXML
								.findViewById(R.id.crearEventoButton);

						crearEventoButton.setVisibility(View.VISIBLE);

						ImageButton buscarButton = (ImageButton) viewMapaXML
								.findViewById(R.id.subirFotoButton);
						buscarButton.setVisibility(View.VISIBLE);

						ImageButton volverButton = (ImageButton) viewMapaXML
								.findViewById(R.id.volverButton);

						volverButton.setVisibility(View.GONE);

						banderaSeCreoNuevoEvento = false;

					}
				});

				// aca se setea el mapa para poner markers
				map.setOnMapClickListener(new OnMapClickListener() {

					@Override
					public void onMapClick(LatLng arg0) {
						// Clears any existing markers from the GoogleMap
						// map.clear();

						// Creating an instance of MarkerOptions to set position
						if (nuevoMarkerEventoCreado != null)
							nuevoMarkerEventoCreado.remove();
						MarkerOptions markerOptions = new MarkerOptions();

						// Setting position on the MarkerOptions
						markerOptions.position(arg0);

						// Animating to the currently touched position
						map.animateCamera(CameraUpdateFactory.newLatLng(arg0));

						// Adding marker on the GoogleMap
						Marker marker = map.addMarker(markerOptions);
						nuevoMarkerEventoCreado = marker;
						Evento evento = new Evento();
						// evento.setId("5");
						evento.setNombre("Nuevo Evento");
						evento.setLatitud("lat");
						evento.setLongitud("long");
						eventosMap.put(marker, evento);
						// Showing InfoWindow on the GoogleMap
						marker.showInfoWindow();
						banderaSeCreoNuevoEvento = true;

					}
				});

			}
		});

		return v;
	}

	private class Ubicaciones extends AsyncTask<Void, Void, JSONArray> {

		JSONArray json3;

		@Override
		protected JSONArray doInBackground(Void... params) {

			json3 = Util.getAll("eventos");

			return json3;

		}

		@Override
		protected void onPostExecute(JSONArray son) {

			if (son != null) {
				List<Evento> eventos = Evento.toListaEventos(json3);
				for (Evento e : eventos) {
					Marker marker = map.addMarker(new MarkerOptions()
							.position(new LatLng(Double.parseDouble(e
									.getLatitud()), Double.parseDouble(e
									.getLongitud()))));
					markerArray.add(marker);
					eventosMap.put(marker, e);
				}
			}
		}
	}

	@Override
	public void onResume() {
		mapView.onResume();
		super.onResume();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		mapView.onDestroy();
	}

	@Override
	public void onLowMemory() {
		super.onLowMemory();
		mapView.onLowMemory();
	}

	@Override
	public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
		inflater.inflate(R.menu.main_activity_actions, menu);
	}

}